/*
A 单链表基本操作
分数 15
作者 朱允刚
单位 吉林大学
请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列，输出实施上述操作后的链表。单链表数据域值为整数。

输入格式 :
输入第1行为1个正整数n，表示当前单链表长度；第2行为n个空格间隔的整数，为该链表n个元素的数据域值。第3行为1个正整数m，表示对该链表施加的操作数量；接下来m行，每行表示一个操作，为2个或3个整数，格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点，若k = 0则表示表头插入。1 k表示删除链表中第k个结点，此时k不能为0。注：操作序列中若含有不合法的操作（如在长度为5的链表中删除第8个结点、删除第0个结点等），则忽略该操作。n和m不超过100000。

输出格式 :
输出为一行整数，表示实施上述m个操作后的链表，每个整数后一个空格。输入数据保证结果链表不空。

输入样例 :
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6

输出样例:
7 1 2 8 3 5

代码长度限制
16 KB
Python(python3)
时间限制
1000 ms
内存限制
256 MB
Java(javac)
时间限制
5000 ms
内存限制
256 MB
其他编译器
时间限制
100 ms
内存限制
10 MB
*/

#include <iostream>
using namespace std;

struct list {
    int data=0;
    struct list* next=NULL;
};
typedef struct list* lin;

lin BuiltList(int n)  //built list;  !no 哨兵节点
{
    lin head=new list();
    lin p1=new list();
    head = NULL;
    p1 = NULL;
    int num;
    for (int i = 0; i < n; i++) {
        cin >> num;
        lin p2 = new list();
        p2->data = num;
        p2->next = NULL;

        if (p1 == NULL) {
            p1 = p2;
            head = p1;
        }
        else {
            p1->next = p2;
            p1 = p2;
        }
    }
    return head;
}

lin deletelin(lin head, int k, int n) {  //delete---"1 k"
    if (k == 0 || k > n) {
        return head;
    }
    if (k == 1) {
        head = head->next;
        return head;
    }
    lin p1 = head;
	lin p2 = new list();
    int i = 1;
    while (i != k) {
        i++;
        p2 = p1;  //p2 is what i need---the k-1(before k)
        p1 = p1->next;  //p1 is the k
    }
    p2->next = p1->next;
    delete p1;
    return head;
}

lin insertlin(lin head, int k, int d, int n) {
    if (k > n) {
        return head;
    }
    if (k == 0) {
        lin p = new list();
        p->data = d;
        p->next = head;
        head = p;
        return head;
    }
    lin p1 = head;
    int i = 1;
    while (i < k) {
        i++;
        p1 = p1->next;  //p2 is what i need---the k(is k)
    }
    lin p2 = new list();
    p2->data = d;
    p2->next = p1->next;
    p1->next = p2;

    return head;
}

int main()
{
    int n;
    cin >> n;

    lin head = BuiltList(n);

    int tim;
    cin >> tim;

    int flag, k, d;
    while (tim) {
        tim--;
        cin >> flag;
        if (flag) {
            cin >> k;
            head = deletelin(head, k, n);
            if (k <= n && k >= 0) {
                n--;
            }
        }
        else {
            cin >> k >> d;
            head = insertlin(head, k, d, n);
            if (k <= n && k >= 0) {
                n++;
            }
        }
    }

    lin p = head;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    return 0;
}
